{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "b1051bc9",
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "import torch.optim as optim\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from torchvision import datasets,transforms"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "d1470f3f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 设置批量大小\n",
    "batch_size = 2048\n",
    "# 指定设备为 CUDA\n",
    "device = torch.device( 'cuda')\n",
    "# 训练数据加载器\n",
    "train_loader = torch.utils.data.DataLoader(\n",
    "    datasets.MNIST( 'data' , train=True,download=True,\n",
    "                   transform=transforms.Compose([\n",
    "                       transforms. ToTensor(),\n",
    "                   ])),\n",
    "    batch_size=batch_size,shuffle=True)\n",
    "# 测试数据加载器\n",
    "test_loader = torch.utils.data.DataLoader(\n",
    "    datasets.MNIST('data' , train=False,transform=transforms.Compose([\n",
    "            transforms.ToTensor(),\n",
    "        ])),\n",
    "    batch_size=batch_size,shuffle=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "87758f0c",
   "metadata": {},
   "outputs": [],
   "source": [
    "class mlp(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(mlp, self).__init__()\n",
    "        # 定义第一层全连接层\n",
    "        self.l1 = nn.Linear(784,128)\n",
    "        # 定义第二层全连接层\n",
    "        self.l2 = nn.Linear(128,10)\n",
    "    def forward(self,x):\n",
    "        # 第一层线性变换后的输出\n",
    "        a1 = self.l1(x)\n",
    "        # 对第一层输出进行ReLU激活函数\n",
    "        x1 = F.relu(a1)\n",
    "        # 第二层线性变换后的输出\n",
    "        a2= self.l2(x1)\n",
    "        # 第二层输出（未经激活函数处理）\n",
    "        x2 = a2\n",
    "        return x2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "f9d894cc",
   "metadata": {},
   "outputs": [],
   "source": [
    "model = mlp().to(device)\n",
    "optimizer = optim.SGD (model.parameters(),lr=0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "6eba446b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch:0, loss:0.7869, acc:0.9530\n",
      "epoch:1, loss:0.7846, acc:0.9530\n",
      "epoch:2, loss:0.7757, acc:0.9530\n",
      "epoch:3, loss:0.7747, acc:0.9530\n",
      "epoch:4, loss:0.7693, acc:0.9530\n",
      "epoch:5, loss:0.7625, acc:0.9530\n",
      "epoch:6, loss:0.7606, acc:0.9530\n",
      "epoch:7, loss:0.7554, acc:0.9530\n",
      "epoch:8, loss:0.7539, acc:0.9530\n",
      "epoch:9, loss:0.7470, acc:0.9530\n",
      "epoch:10, loss:0.7456, acc:0.9530\n",
      "epoch:11, loss:0.7396, acc:0.9530\n",
      "epoch:12, loss:0.7364, acc:0.9530\n",
      "epoch:13, loss:0.7275, acc:0.9530\n",
      "epoch:14, loss:0.7269, acc:0.9530\n",
      "epoch:15, loss:0.7250, acc:0.9530\n",
      "epoch:16, loss:0.7213, acc:0.9530\n",
      "epoch:17, loss:0.7152, acc:0.9530\n",
      "epoch:18, loss:0.7112, acc:0.9530\n",
      "epoch:19, loss:0.7065, acc:0.9530\n",
      "epoch:20, loss:0.7032, acc:0.9530\n",
      "epoch:21, loss:0.6995, acc:0.9530\n",
      "epoch:22, loss:0.6979, acc:0.9530\n",
      "epoch:23, loss:0.6933, acc:0.9530\n",
      "epoch:24, loss:0.6898, acc:0.9530\n",
      "epoch:25, loss:0.6883, acc:0.9530\n",
      "epoch:26, loss:0.6856, acc:0.9530\n",
      "epoch:27, loss:0.6835, acc:0.9530\n",
      "epoch:28, loss:0.6762, acc:0.9530\n",
      "epoch:29, loss:0.6722, acc:0.9530\n"
     ]
    }
   ],
   "source": [
    "epochs = 30\n",
    "train_losses = []\n",
    "# 进行训练循环\n",
    "for epoch in range(epochs):\n",
    "    model.train()\n",
    "    train_loss = 0.0\n",
    "    for batch_idx, (x, y) in enumerate(train_loader):\n",
    "        x, y = x.view(x.shape[0], -1).to(device), y.to(device)\n",
    "        optimizer.zero_grad()  # 梯度清零\n",
    "        output = model(x)  # 模型前向传播\n",
    "        loss = F.cross_entropy(output, y)  # 计算交叉熵损失\n",
    "        loss.backward()  # 反向传播计算梯度\n",
    "        optimizer.step()  # 更新模型参数\n",
    "        train_loss += loss.item()\n",
    "    # 计算平均训练损失\n",
    "    train_loss /= len(train_loader)\n",
    "    train_losses.append(train_loss)\n",
    "    \n",
    "    # 测试模型性能\n",
    "    model.eval()\n",
    "    correct = 0\n",
    "    test_loss = 0\n",
    "    with torch.no_grad():\n",
    "        for batch_idx, (x, y) in enumerate(test_loader):\n",
    "            x, y = x.view(x.shape[0], -1).to(device), y.to(device)\n",
    "            output = model(x)  # 模型前向传播\n",
    "            test_loss += F.cross_entropy(output, y)  # 计算测试集损失\n",
    "            pred = output.max(1, keepdim=True)[1]  # 获取预测值\n",
    "            correct += pred.eq(y.view_as(pred)).sum().item()  # 统计正确预测数量\n",
    "    print('epoch:{}, loss:{:.4f}, acc:{:.4f}'.format(epoch, test_loss, acc))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "e655c456",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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iOgumEldABEZr/vvvx+ffPKJVptSqZSoGiLSBY8IEJHOlEolXF1dtSYHBwcATYftV61ahZiYGFhaWsLHxwebN2/WWv7UqVO47777YGlpifbt2+Opp55CVVWV1jzr1q1Dr169oFQq4ebmhjlz5mi9X1xcjHHjxsHKygrdunXDd999d28/NFEbwyBARPfMyy+/jIceeggnTpzAlClTMGnSJJw5cwYAUFNTg/vvvx8ODg44duwYNm/ejJ9//lnri37VqlV49tln8dRTT+HUqVP47rvv0LVrV611vPrqq3j44Ydx8uRJjBw5Eo8++ihKS0tb9XMSGTX9PTCRiEzJtGnTRLlcLlpbW2tNixcvFkWx6VGys2bN0lomPDxcfOaZZ0RRFMU1a9aIDg4OYlVVleb97du3izKZTCwoKBBFURTd3d3F+Pj4W9YAQHzppZc0f1dVVYmCIIg//vij3j4nUVvHawSISGdDhgzBqlWrtNocHR01ryMiIrTei4iIQHp6OgDgzJkzCAwMhLW1teb9/v37o7GxEefOnYMgCLh8+TKGDh162xp69+6teW1tbQ0bGxsUFhbq+pGITA6DABHpzNra+oZD9XciCAIAQBRFzeubzWNpadms/szNzW9YtrGx8a5qIjJlvEaAiO6Zw4cP3/C3n58fAKBnz55IT09HdXW15v2DBw9CJpOhe/fusLGxgbe3N3bv3t2qNROZGh4RICKdqVQqFBQUaLWZmZnByckJALB582aEhYVhwIAB+PLLL3H06FF8/PHHAIBHH30UCxcuxLRp07Bo0SIUFRVh7ty5mDp1KlxcXAAAixYtwqxZs9ChQwfExMSgsrISBw8exNy5c1v3gxK1YQwCRKSznTt3ws3NTavN19cXZ8+eBdB0Rf9XX32F2bNnw9XVFV9++SV69uwJALCyssKuXbvwz3/+E3369IGVlRUeeughvPPOO5q+pk2bhtraWrz77ruYN28enJycMGHChNb7gEQmQBBFUZS6CCJqewRBwDfffIOxY8dKXQoR3QavESAiIjJhDAJEREQmjNcIENE9wbOORMaBRwSIiIhMGIMAERGRCWMQICIiMmEMAkRERCaMQYCIiMiEMQgQERGZMAYBIiIiE8YgQEREZML+H9tSeEW0XrE7AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 1200x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制训练损失随epoch变化的曲线\n",
    "plt.figure(figsize=(12, 4))\n",
    "plt.subplot(1, 2, 1)\n",
    "plt.plot(train_losses, label='Train Loss')\n",
    "plt.xlabel('Epoch')\n",
    "plt.ylabel('Loss')\n",
    "plt.title('Train Losses')\n",
    "plt.legend()\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ef87dab0",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
